package 多个客户重复发送;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 在线聊天室：客户端实现
 * 目标：实现多个客户端同时收发信息（多线程）
 */
public class Chat {
    public static void main(String[] args) throws IOException {
        System.out.println("-----------Server------------");
        //1.指定端口，打开一个服务端
        ServerSocket chat = new ServerSocket(8888);
        //2.阻塞式接收accept()
        while (true){
            //这样会问题：多个用户进入时，后面一个客户必须等待前面一个客户使用完以后才能使用
            Socket socket = chat.accept();
            new Thread(()->{
                DataInputStream dis = null;
                try {
                    dis = new DataInputStream(socket.getInputStream());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                DataOutputStream dos = null;
                try {
                    dos = new DataOutputStream(socket.getOutputStream());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                boolean isRunning = true;
                System.out.println("一个客户端建立了连接");
                while (isRunning){
                    //3.接收消息
                    String mag = null;
                    try {
                        mag = dis.readUTF();
                        //4.返回消息
                        dos.writeUTF(mag);
                        dos.flush();
                    } catch (IOException e) {
                        isRunning = false;
                    }
                    //System.out.println(mag);
                }
                //5.关闭、释放资源
                try {
                    if (null == chat){
                        chat.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (null == socket){
                        socket.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (null == dis){
                        dis.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    if (null == dos) {
                        dos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();


        }
    }
}
